iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 25

提升效率就靠-Spring Boot 的非同步處理

  • 分享至 

  • xImage
  •  

相信這個時代,大家在操作應用程式,特別是web的時候,都無法忍受慢個1、2秒的時間,因此,提升效能跟減少響應時間是非常重要的,而Spring Boot的非同步處理機制,正好可以解決這類問題。

@Async註解

@Async是Spring的註解,將方法標註為「非同步」方法。當Spring Boot遇到此註解時,會獨立於線程執行此方法,避免在主線程使用,導致阻塞的可能。適用於額外處理且耗時的操作,像是調用外部API、DB操作、文件處理等等。

使用說明

  • 啟用非同步
    必須先於主程式或配置類加上@EnableAsync註解,告知Spring Boot此專案允許使用非同步機制:
@SpringBootApplication
@EnableAsync
public class AsyncApplication {
    public static void main(String[] args) {
        SpringApplication.run(AsyncApplication.class, args);
    }
}
  • 標註非同步方法
    在要使用非同步的方法,加上@Async註解,告知Spring Boot此方法須採用非同步方式進行:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service 
public class AsyncService {

    @Async // 標為非同步,此方法被調用時,會由另個thread執行,不占用主thread。
    public void task() {
    
        // 印出此方法執行之thread名,確認與主thread不同
        System.out.println("非同步任務:" + Thread.currentThread().getName());
        try {
            Thread.sleep(3000); // 模擬Thread暫停三秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("完成");
    }
}
  • 調用非同步方法
    要使用時,在controller或service調用前述非同步方法即可:
@RestController
public class AsyncController {
    
    private final AsyncService asyncService;

    public AsyncController(AsyncService asyncService) {
        this.asyncService = asyncService;
    }

    @GetMapping("/startTask")
    public String startAsyncTask() {
        asyncService.task();
        return "非同步任務已啟動";
    }
}

代表當調用 /startTask 時,系統會立刻返回 '非同步任務已啟動' 的響應,而不必等到 task() 方法完全執行結束。

@Async是Spring Framework的一部分,雖非Spring Boot獨有,但使用Spring Boot同樣具有配置簡化的優勢,只要使用@EnableAsync就能快速啟動非同步機制,處理起來更方便也更快速。


上一篇
分頁與排序的藝術-Pageable及Sort的實踐
下一篇
緩存與資料儲存的最佳夥伴-Redis
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言